package `01-agency`

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

/**
 * 提供者委托
 * 功能：
 * 可以根据情况选择不同的代理类，重载了by操作符
 */

/**
 * provideDelegate放在类的外边，是类的扩展函数，和放在类的内部效果一样
 */
operator fun AgencyProvideDelegate.provideDelegate(any: Any, prop: KProperty<*>): ReadWriteProperty<Any, String> {
    //如果委托属性的名称 = str，返回AgencyClass01，如果不等于str，返回AgencyClass02
    if (prop.name.equals("str")) {
        return AgencyClass01();
    } else {
        return AgencyClass02();
    }
}

class AgencyProvideDelegate {
    /**
     * provideDelegate重载by操作符
     * 参数：
     * 1.委托属性所在类或其父类
     * 2.固定KProperty<*>，委托属性的参数
     * 返回类型：ReadWriteProperty<Any,String>
     */
//    operator fun provideDelegate(any: Any,prop:KProperty<*>):ReadWriteProperty<Any,String>{
//        //如果委托属性的名称 = str，返回AgencyClass01，如果不等于str，返回AgencyClass02
//        if(prop.name.equals("str")){
//            return AgencyClass01();
//        }else{
//            return AgencyClass02();
//        }
//    }

}

class AgencyClass01 : ReadWriteProperty<Any, String> {
    var str = "AgencyClass01"
    override fun getValue(thisRef: Any, property: KProperty<*>): String {
        return str
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {
        str = value
    }
}

class AgencyClass02 : ReadWriteProperty<Any, String> {
    var str = "AgencyClass02"
    override fun getValue(thisRef: Any, property: KProperty<*>): String {
        return str
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {
        str = value
    }
}

class Agency01 {
    /**
     * 实际委托类是AgencyClass01
     * by操作符执行的AgencyProvideDelegate类的provideDelegate方法
     */
    var str: String by AgencyProvideDelegate()

    /**
     * 实际委托类是AgencyClass02
     * by操作符执行的AgencyProvideDelegate类的provideDelegate方法
     */
    var str02: String by AgencyProvideDelegate()//AgencyClass02代理
}

fun main() {
    var agency01 = Agency01()
    println(agency01.str)
    println(agency01.str02)
}

